
function page_size_listen_class() {
    let _this=this;
    _this.objs={};//存放所有注册的数据 {"a":{"name":"布局1","change_name":"height","now":"35",val:"",change_func:func}}
    _this.objs2={};//存放所有关联的数据 {"布局1":{"change_name":"height",lst:["a"]}}
    _this.run_func=function(str_,obj=null,test=false){
        if ((typeof str_) ==='function'){
                return str_("calc("+obj+")");
        }
        try{
            if (str_==''){return null;}
            else if (str_.includes('.')){
                let arr = str_.split('.');  
                let run_func=window
                for (let i=0;i<arr.length-1;i++){ run_func=run_func[arr[i]]}
                run_func[arr[arr.length-1]]("calc("+obj+")");
            }else{
                return window[str_]("calc("+obj+")");
            }
            
      }catch(err){if(test){console.log("lhp_run_func err:",err);
    }}
    }
    _this.注册=function(obj){
        let key_name=obj.key_name;//注册的名称 唯一
        let name=obj.name;//注册的空间名称  如果同空间有数据变动，那么会调用同空间的其他数据的 change_func函数
        let change_name=obj.change_name;//注册的数据名称  height或者width
        let change_func=obj.change_func;//注册的调用函数  将数据同步到位 的函数
        let val=obj.val;//计算的值35px  【表示35px】100% - 35px 【100% - 35px】width - {a} - {b} 【表示浏览器值-布局中a占有的尺寸值 -布局中b占有的尺寸值】
        _this.objs[key_name]={
            key_name:key_name,
            change_name:change_name,
            change_func:change_func,
            name:name,
            val:val
        }
        if(_this.objs2[name]){
            _this.objs2[name].lst.push(key_name);
        }else{
            // console.log("不存在则新建",key_name,[key_name])
            let new_l=[key_name]
            _this.objs2[name]={lst:[key_name],change_name:change_name}
            // console.log("不存在则新建",key_name,_this.objs2[name])
        }
        _this.更新空间(name);
        let 更新函数=function(val){
            console.log("开始更新值",{key_name:key_name,val:val})
            _this.更新值({key_name:key_name,val:val});
        }
        return 更新函数
    }
    _this.eval=function(obj,val){
        while (val){
            let new_val=_this.替换值(val,obj);
            if(new_val==null){return val}
            else if(new_val==undefined){return undefined}
            else{
                val=new_val;
            }
        }
    }

    _this.替换值=function(inputStr,obj) {
        // Step 1: 获取字符串中第一个 '{' 字符的索引
        let openBracketIndex = inputStr.indexOf('{');
        // 检查是否找到了 '{'
        if (openBracketIndex === -1) {
          return null; // 或者你可以抛出一个错误
        }
        // Step 2: 获取字符串中第一个 '}' 字符的索引
        let closeBracketIndex = inputStr.indexOf('}');
        
        // Step 3: 根据 '{' 和 '}' 的索引，获取 '{' 到 '}' 中间的字符串，并保存到变量 xx 中
        let xx = inputStr.substring(openBracketIndex + 1, closeBracketIndex);
        if(obj[xx]==undefined){
            return undefined
        }
        // Step 4: 将从 '{' 到 '}' 的字符串替换为字符串 "rrrr"
        let resultStr = inputStr.slice(0, openBracketIndex) + '('+obj[xx]+')' + inputStr.slice(closeBracketIndex + 1);
        
        // 返回结果字符串和变量 xx（虽然 xx 是在函数内部使用的，但你可以根据需要返回它）
        return resultStr
      }
    _this.更新空间=function(name){try{
        console.log("开始更新值3",name)
        let set_val={};
        let lst=JSON.parse(JSON.stringify(_this.objs2[name].lst));
        let val_default={height:window.innerHeight+'px',width:window.innerWidth+'px'};
        console.log("开始更新值3-2",val_default)
        for(let i=0;i<lst.length;i++){
            val_default[lst[i]]=_this.objs[lst[i]].val;
        }
        for (let i=0;i<lst.length;i++){
            set_val[lst[i]]=undefined
        }
        console.log("开始更新值3-3",_this,lst)
        while (lst.length){
            let key_name=lst.shift();
            let val=_this.objs[key_name].val;
            console.log("更新空间3",_this,name)
            try{
                let new_val=_this.eval(val_default,val);
                if(new_val!=undefined){
                    set_val[key_name]=new_val;
                    console.log("运行",name,_this.objs2[name],key_name,new_val)
                    _this.run_func(_this.objs[key_name].change_func,new_val);
                }else{
                    lst.push(key_name);
                }

            }catch (err){
                
                console.log("更新空间err",_this,name,err)
            }

            
        }}catch (err){console.log("开始更新值3-2 err",err)}
    };
    _this.更新值=function(obj){
        let key_name=obj.key_name;
        let val=obj.val;
        _this.objs[key_name].val=val;
        console.log("开始更新值2",_this.objs[key_name].name)
        try{
        _this.更新空间(_this.objs[key_name].name)}catch (err){console.log("开始更新值2-2 err",err)}

    }
    _this.更新所有设置 = function(){
        for(let k in _this.objs2){
            _this.更新空间(k);
        }
    };  
    window.addEventListener('resize',_this.更新所有设置);  
}  
// page_size_listen_obj=new page_size_listen_class();
// 更新函数=page_size_listen_obj.注册({key_name:"容器上",name:"布局空间1",change_name:"height",change_func:'',val:'35'})
// page_size_listen_obj.更新所有设置()